/*
 * Context.h
 *
 *  Created on: 28/11/2008
 *      Author: fernando
 */

#ifndef CONTEXT_H_
#define CONTEXT_H_

#include <vector>
#include <allegro.h>

#include "defs.h"

#include "Synchronizer.h"
#include "AllegroException.h"
#include "Metrics.h"

using namespace core;

/**
 * Ponto de entrada da aplicação. Esta classe é encarregada de inicializar os
 * recursos da allegro e da aplicação, e descarregar estes recursos no final.
 */
class Context: public Synchronizable {
	static Context* _instance;

	BITMAP* _buffer;

	Metrics _metrics;
	std::vector<Vertex> _surface;
	Synchronizer* _synchronizer;

	/** Construtor da classe.*/
	Context();

	/**
	 * Método de sincronia. Ao invés de um looping eterno este aplicativo usa um
	 * sistema de sincronia mantido pela classe {@link Synchronizer} que garante
	 * o mesmo tempo de execução para cada ciclo.
	 *
	 * @param past_seconds Quantidade de segundos passados desde a última
	 * sincronia.
	 */
	void synch(float const& past_seconds);

public:

	/**
	 * Inicializa os recursos da biblioteca allegro.
	 *
	 * @return Zero em caso da allegro ter sido carregada corretamente ou o
	 * código do erro ocorrido.
	 */
	void build_allegro() throw(AllegroException);

	/** Descarrega os recursos da biblioteca allegro. */
	void destroy_allegro() throw(AllegroException);

	/** Destrutor da classe. */
	virtual ~Context();

	/** Retorna a única instância desta classe. */
	static Context* instance();

	/** Retorna a instância do sincronizador da aplicação. */
	Synchronizer& synchronizer();

	/** Retorna os vértices da superfície. */
	std::vector<Vertex>& surface();

	/** Carrega um mapa de vértices da superfície */
	void load_surface(std::string filename);

};

#endif /* CONTEXT_H_ */
